package service

import (
	"github.com/astaxie/beego"
	"github.com/garyburd/redigo/redis"
)

type Redis_tool struct{}

var client redis.Conn

func (r *Redis_tool) Init(number int) {
	client = getRedisConn(number)
}
func getRedisConn(number int) redis.Conn {
	var client redis.Conn
	//获取配置文件中信息
	beego.BConfig.RunMode = "dev"
	host := beego.AppConfig.String("redis_host")
	password := beego.AppConfig.String("redis_password")
	tool := Logs_Tool{}
	tool.RedisFile()
	client, err := redis.Dial("tcp", host, redis.DialDatabase(number))
	if err != nil {
		return nil
	}
	if password != "" {
		_, err = client.Do("AUTH", password)
		if err != nil {
			return nil
		}
	}
	return client
}

//Redis Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
func (r *Redis_tool) Lpush(key, value string) bool {
	res, _ := redis.Bool(client.Do("LPUSH", key, value))
	return res
}

//Redis Lrange 返回列表中指定区间内的元素，
//区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素， 1 表示列表的第二个元素，以此类推。 你也可以使用负数下标，以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推。
func (r *Redis_tool) Lrange(key string, start int, stop int) ([]interface{}, error) {
	res, err := redis.Values(client.Do("LRANGE", key, start, stop))
	return res, err
}

// 写入无序结合
func (r *Redis_tool) Set(key, value string) error {
	_, err := client.Do("SET", key, value)
	return err
}
func (r *Redis_tool) Get(key string) (string, error) {
	res, err := redis.String(client.Do("GET", key))
	return res,err
}
// 写入有序结合
func (r *Redis_tool) Zadd(key string, number int, value string) error {
	_, err := client.Do("ZADD", key, number, value)
	return err
}

//返回有序集中，指定区间内的成员。
func (r *Redis_tool) Zrange(key string, start int, stop int) ([]interface{}, error) {
	res, err := redis.Values(client.Do("ZRANGE", key, start, stop))
	return res, err

}

// Expire 命令用于设置 key 的过期时间，key 过期后将不再可用。单位以秒计
func (r *Redis_tool) Expire(key string, time int) bool {
	res, _ := redis.Bool(client.Do("EXPIRE", key, time))
	return res
}

// 检测是否存在
func (r *Redis_tool) Bool(key string) bool {
	res, _ := redis.Bool(client.Do("EXISTS", key))
	return res
}

// 关闭连接
func (r *Redis_tool) Close() {
	client.Close()
}
